package com.cskaoyan.javase.network._2tcp._v3;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 多线程实现多个客户端连接一个服务端,并且多个客户端都可以多次向服务端发送消息
 * 思路也很简单，只需要服务端进程起多个线程处理多台客户端连接就好了
 * 也就是说这时的服务端要变成多线程的，一个线程处理一个客户端连接。
 *
 * 这时的服务端要多线程,去执行客户端的连接任务
 * 在这里连接任务,还需要处理客户端发送的消息
 *
 * 在线程任务的循环当中中获取一个连接,然后执行,这样是不行的,因为获取连接的方法是一个阻塞方法
 * 这样会导致一个客户端在连接以后会再次执行accept方法,这是一个阻塞方法
 *
 * 最好的办法是获取一个连接以后,把这个连接交给一个线程去执行
 *
 * @since 15:56
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        // new Thread(new ConnectTask(serverSocket)).start();
        // new Thread(new ConnectTask(serverSocket)).start();
        // 客户端连接服务端需要频繁使用线程,所以最好使用线程池
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        while (true) {
            Socket socket = serverSocket.accept();
            executorService.submit(new ConnectTask(socket));
        }
    }
}
